package pe.edu.sistemas.postgrado.samupg.domain.model;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "usuario", catalog = "bd_samupg")
public class Usuario implements java.io.Serializable {

    private Integer usuId;
    private String usuApellidoPaterno;
    private String usuApellidoMaterno;
    private String usuNombres;
    private String usuNick;
    private String usuPass;
    private String usuDni;
    private String usuTelefono;
    private String usuTipo;
    private List<Publicacion> publicaciones = new ArrayList<Publicacion>(0);
    private List<Correo> correos = new ArrayList<Correo>(0);
    private List<Notificacion> notificaciones = new ArrayList<Notificacion>(0);
    private List<FichaInscripcion> fichasInscripciones = new ArrayList<FichaInscripcion>(0);

    public Usuario() {
    }

    public Usuario(String usuApellidoPaterno, String usuApellidoMaterno, String usuNombres, String usuNick, String usuPass, String usuDni, String usuTelefono, String usuTipo, List<Publicacion> publicacions, List<Correo> correos, List<Notificacion> notificaciones, List<FichaInscripcion> fichasInscripciones) {
        this.usuApellidoPaterno = usuApellidoPaterno;
        this.usuApellidoMaterno = usuApellidoMaterno;
        this.usuNombres = usuNombres;
        this.usuNick = usuNick;
        this.usuPass = usuPass;
        this.usuDni = usuDni;
        this.usuTelefono = usuTelefono;
        this.usuTipo = usuTipo;
        this.publicaciones = publicacions;
        this.correos = correos;
        this.notificaciones = notificaciones;
        this.fichasInscripciones = fichasInscripciones;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "usu_id", unique = true, nullable = false)
    public Integer getUsuId() {
        return this.usuId;
    }

    public void setUsuId(Integer usuId) {
        this.usuId = usuId;
    }

    @Column(name = "usu_apellido_paterno", length = 80)
    public String getUsuApellidoPaterno() {
        return this.usuApellidoPaterno;
    }

    public void setUsuApellidoPaterno(String usuApellidoPaterno) {
        this.usuApellidoPaterno = usuApellidoPaterno;
    }

    @Column(name = "usu_apellido_materno", length = 80)
    public String getUsuApellidoMaterno() {
        return this.usuApellidoMaterno;
    }

    public void setUsuApellidoMaterno(String usuApellidoMaterno) {
        this.usuApellidoMaterno = usuApellidoMaterno;
    }

    @Column(name = "usu_nombres", length = 150)
    public String getUsuNombres() {
        return this.usuNombres;
    }

    public void setUsuNombres(String usuNombres) {
        this.usuNombres = usuNombres;
    }

    @Column(name = "usu_nick", length = 45)
    public String getUsuNick() {
        return this.usuNick;
    }

    public void setUsuNick(String usuNick) {
        this.usuNick = usuNick;
    }

    @Column(name = "usu_pass", length = 45)
    public String getUsuPass() {
        return this.usuPass;
    }

    public void setUsuPass(String usuPass) {
        this.usuPass = usuPass;
    }

    @Column(name = "usu_dni", length = 8)
    public String getUsuDni() {
        return this.usuDni;
    }

    public void setUsuDni(String usuDni) {
        this.usuDni = usuDni;
    }

    @Column(name = "usu_telefono", length = 45)
    public String getUsuTelefono() {
        return this.usuTelefono;
    }

    public void setUsuTelefono(String usuTelefono) {
        this.usuTelefono = usuTelefono;
    }

    @Column(name = "usu_tipo", length = 45)
    public String getUsuTipo() {
        return this.usuTipo;
    }

    public void setUsuTipo(String usuTipo) {
        this.usuTipo = usuTipo;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
    @Fetch(value = FetchMode.SUBSELECT)
    public List<Publicacion> getPublicaciones() {
        return this.publicaciones;
    }

    public void setPublicaciones(List<Publicacion> publicaciones) {
        this.publicaciones = publicaciones;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "usuario")
    public List<Correo> getCorreos() {
        return this.correos;
    }

    public void setCorreos(List<Correo> correos) {
        this.correos = correos;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
    public List<Notificacion> getNotificaciones() {
        return this.notificaciones;
    }

    public void setNotificaciones(List<Notificacion> notificacions) {
        this.notificaciones = notificacions;
    }

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
    public List<FichaInscripcion> getFichasInscripciones() {
        return this.fichasInscripciones;
    }

    public void setFichasInscripciones(List<FichaInscripcion> fichaInscripcions) {
        this.fichasInscripciones = fichaInscripcions;
    }
}
